home *** CD-ROM | disk | FTP | other *** search
- #ifndef lint
- static char rcsid[] = "$Header: xscreen.c,v 1.7 87/05/19 18:46:22 schoch Exp $";
- #endif
-
- #include "externs.h"
-
- static Pixmap white, black;
- static FontInfo info;
-
- #define tile_width 64
- #define tile_height 64
- static short white_bits[] = {
- 0xdddd, 0xdddd, 0xdddd, 0xdddd,
- 0xeeee, 0xeeee, 0xeeee, 0xeeee,
- 0xbbbb, 0xbbbb, 0xbbbb, 0xbbbb,
- 0x7777, 0x7777, 0x7777, 0x7777,
- 0xdddd, 0xdddd, 0xdddd, 0xdddd,
- 0xeeee, 0xeeee, 0xeeee, 0xeeee,
- 0xbbbb, 0xbbbb, 0xbbbb, 0xbbbb,
- 0x7777, 0x7777, 0x7777, 0x7777,
- 0xdddd, 0xdddd, 0xdddd, 0xdddd,
- 0xeeee, 0xeeee, 0xeeee, 0xeeee,
- 0xbbbb, 0xbbbb, 0xbbbb, 0xbbbb,
- 0x7777, 0x7777, 0x7777, 0x7777,
- 0xdddd, 0xdddd, 0xdddd, 0xdddd,
- 0xeeee, 0xeeee, 0xeeee, 0xeeee,
- 0xbbbb, 0xbbbb, 0xbbbb, 0xbbbb,
- 0x7777, 0x7777, 0x7777, 0x7777,
- 0xdddd, 0xdddd, 0xdddd, 0xdddd,
- 0xeeee, 0xeeee, 0xeeee, 0xeeee,
- 0xbbbb, 0xbbbb, 0xbbbb, 0xbbbb,
- 0x7777, 0x7777, 0x7777, 0x7777,
- 0xdddd, 0xdddd, 0xdddd, 0xdddd,
- 0xeeee, 0xeeee, 0xeeee, 0xeeee,
- 0xbbbb, 0xbbbb, 0xbbbb, 0xbbbb,
- 0x7777, 0x7777, 0x7777, 0x7777,
- 0xdddd, 0xdddd, 0xdddd, 0xdddd,
- 0xeeee, 0xeeee, 0xeeee, 0xeeee,
- 0xbbbb, 0xbbbb, 0xbbbb, 0xbbbb,
- 0x7777, 0x7777, 0x7777, 0x7777,
- 0xdddd, 0xdddd, 0xdddd, 0xdddd,
- 0xeeee, 0xeeee, 0xeeee, 0xeeee,
- 0xbbbb, 0xbbbb, 0xbbbb, 0xbbbb,
- 0x7777, 0x7777, 0x7777, 0x7777,
- 0xdddd, 0xdddd, 0xdddd, 0xdddd,
- 0xeeee, 0xeeee, 0xeeee, 0xeeee,
- 0xbbbb, 0xbbbb, 0xbbbb, 0xbbbb,
- 0x7777, 0x7777, 0x7777, 0x7777,
- 0xdddd, 0xdddd, 0xdddd, 0xdddd,
- 0xeeee, 0xeeee, 0xeeee, 0xeeee,
- 0xbbbb, 0xbbbb, 0xbbbb, 0xbbbb,
- 0x7777, 0x7777, 0x7777, 0x7777,
- 0xdddd, 0xdddd, 0xdddd, 0xdddd,
- 0xeeee, 0xeeee, 0xeeee, 0xeeee,
- 0xbbbb, 0xbbbb, 0xbbbb, 0xbbbb,
- 0x7777, 0x7777, 0x7777, 0x7777,
- 0xdddd, 0xdddd, 0xdddd, 0xdddd,
- 0xeeee, 0xeeee, 0xeeee, 0xeeee,
- 0xbbbb, 0xbbbb, 0xbbbb, 0xbbbb,
- 0x7777, 0x7777, 0x7777, 0x7777,
- 0xdddd, 0xdddd, 0xdddd, 0xdddd,
- 0xeeee, 0xeeee, 0xeeee, 0xeeee,
- 0xbbbb, 0xbbbb, 0xbbbb, 0xbbbb,
- 0x7777, 0x7777, 0x7777, 0x7777,
- 0xdddd, 0xdddd, 0xdddd, 0xdddd,
- 0xeeee, 0xeeee, 0xeeee, 0xeeee,
- 0xbbbb, 0xbbbb, 0xbbbb, 0xbbbb,
- 0x7777, 0x7777, 0x7777, 0x7777,
- 0xdddd, 0xdddd, 0xdddd, 0xdddd,
- 0xeeee, 0xeeee, 0xeeee, 0xeeee,
- 0xbbbb, 0xbbbb, 0xbbbb, 0xbbbb,
- 0x7777, 0x7777, 0x7777, 0x7777,
- 0xdddd, 0xdddd, 0xdddd, 0xdddd,
- 0xeeee, 0xeeee, 0xeeee, 0xeeee,
- 0xbbbb, 0xbbbb, 0xbbbb, 0xbbbb,
- 0x7777, 0x7777, 0x7777, 0x7777};
-
- static short black_bits[] = {
- 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa,
- 0x5555, 0x5555, 0x5555, 0x5555,
- 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa,
- 0x5555, 0x5555, 0x5555, 0x5555,
- 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa,
- 0x5555, 0x5555, 0x5555, 0x5555,
- 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa,
- 0x5555, 0x5555, 0x5555, 0x5555,
- 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa,
- 0x5555, 0x5555, 0x5555, 0x5555,
- 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa,
- 0x5555, 0x5555, 0x5555, 0x5555,
- 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa,
- 0x5555, 0x5555, 0x5555, 0x5555,
- 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa,
- 0x5555, 0x5555, 0x5555, 0x5555,
- 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa,
- 0x5555, 0x5555, 0x5555, 0x5555,
- 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa,
- 0x5555, 0x5555, 0x5555, 0x5555,
- 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa,
- 0x5555, 0x5555, 0x5555, 0x5555,
- 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa,
- 0x5555, 0x5555, 0x5555, 0x5555,
- 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa,
- 0x5555, 0x5555, 0x5555, 0x5555,
- 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa,
- 0x5555, 0x5555, 0x5555, 0x5555,
- 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa,
- 0x5555, 0x5555, 0x5555, 0x5555,
- 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa,
- 0x5555, 0x5555, 0x5555, 0x5555,
- 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa,
- 0x5555, 0x5555, 0x5555, 0x5555,
- 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa,
- 0x5555, 0x5555, 0x5555, 0x5555,
- 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa,
- 0x5555, 0x5555, 0x5555, 0x5555,
- 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa,
- 0x5555, 0x5555, 0x5555, 0x5555,
- 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa,
- 0x5555, 0x5555, 0x5555, 0x5555,
- 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa,
- 0x5555, 0x5555, 0x5555, 0x5555,
- 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa,
- 0x5555, 0x5555, 0x5555, 0x5555,
- 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa,
- 0x5555, 0x5555, 0x5555, 0x5555,
- 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa,
- 0x5555, 0x5555, 0x5555, 0x5555,
- 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa,
- 0x5555, 0x5555, 0x5555, 0x5555,
- 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa,
- 0x5555, 0x5555, 0x5555, 0x5555,
- 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa,
- 0x5555, 0x5555, 0x5555, 0x5555,
- 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa,
- 0x5555, 0x5555, 0x5555, 0x5555,
- 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa,
- 0x5555, 0x5555, 0x5555, 0x5555,
- 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa,
- 0x5555, 0x5555, 0x5555, 0x5555,
- 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa,
- 0x5555, 0x5555, 0x5555, 0x5555};
-
-
- screen_init()
- {
- Bitmap bm;
-
- bm = XStoreBitmap(tile_width, tile_height, white_bits);
- white = XMakePixmap(bm, WhitePixel, BlackPixel);
- XFreeBitmap(bm);
- bm = XStoreBitmap(tile_width, tile_height, black_bits);
- black = XMakePixmap(bm, WhitePixel, BlackPixel);
- XFreeBitmap(bm);
- XQueryFont(font, &info);
- }
-
- redraw()
- {
- int i, j;
- Pixmap tile;
-
- for (i = 0; i <= 8; i++)
- XLine(window, i*64, TOPSPACE, i*64, 64*8+TOPSPACE,
- 1, 1, BlackPixel, GXcopy, 1);
- for (i = 0; i <= 8; i++)
- XLine(window, 0, i*64+TOPSPACE, 64*8, i*64+TOPSPACE,
- 1, 1, BlackPixel, GXcopy, 1);
- for (i = 0; i < 8; i++)
- for (j = 0; j < 8; j++) {
- if ((i + j) & 1)
- tile = black;
- else
- tile = white;
- XPixmapPut(window, 1, 1, i*64+1, j*64+1+TOPSPACE, 63, 63, tile, GXcopy, 1);
- }
- redraw_pieces();
- redraw_message(0);
- XFlush();
- }
-
- redraw_region(x, y, width, height)
- {
- int pos;
- register tx, ty;
- register endx, endy;
-
- endy = y+height;
- endx = x+width;
- if (y < TOPSPACE-64) {
- redraw_message(1);
- y = TOPSPACE-64;
- }
- if (endy >= TOPSPACE+64*9) {
- redraw_message(2);
- endy = TOPSPACE+64*9;
- }
- /* WARNING! Magic numbers present! */
- endy = (endy-18+63 & ~63) + 18;
- endx = (endx+63) & ~63;
- if (y < TOPSPACE) { /* Do captured pieces */
- tx = (x+width+31) / 32;
- for(ty = (x / 64) * 2; ty < tx; ty += 2)
- redraw_captured(reverse ? ty + 16 : ty);
- for(ty = x < 32 ? 1 : x / 32 - 1 | 1; ty < tx; ty += 2)
- redraw_captured(reverse ? ty + 16 : ty);
- }
- if (endy > TOPSPACE+64*8) {
- pos = x / 32;
- tx = (x+width+31) / 32;
- for(ty = (x / 64) * 2; ty < tx; ty += 2)
- redraw_captured(reverse ? ty : ty + 16);
- for(ty = x < 32 ? 1 : x / 32 - 1 | 1; ty < tx; ty += 2)
- redraw_captured(reverse ? ty : ty + 16);
- }
- for (ty = y; ty < endy; ty += 64)
- for (tx = x; tx < endx; tx += 64) {
- pos = xytopos(tx, ty);
- if (pos < 0 || whose[pos] == OFFBOARD)
- continue;
- redraw_pos(pos);
- if (state == PLAYING && ghost[pos])
- redraw_ghost(pos);
- else if (whose[pos] == ourcolor ||
- (state != PLAYING && whose[pos] != EMPTY))
- redraw_piece(pos);
- }
- }
-
- redraw_pos(pos)
- {
- int x, y;
- Pixmap tile;
-
- if (reverse) {
- x = 8-pos%10;
- y = 8-pos/10;
- } else {
- x = pos%10-1;
- y = pos/10-1;
- }
- if (whose[pos] == OFFBOARD) { /* Captured area */
- XPixSet(window, x*64+1, y*64+1+TOPSPACE, 64, 64, BlackPixel);
- return;
- }
- if ((x+y) & 1)
- tile = black;
- else
- tile = white;
- XPixmapPut(window, 1, 1, x*64+1, y*64+1+TOPSPACE, 63, 63, tile, GXcopy, 1);
- }
-
- static struct w {
- int x, y, len;
- char buf[128];
- } w[] =
- { { 0, 0, 48}, /* MESSAGE */
- { 0, 64*9+1+TOPSPACE, 48}, /* CHECK */
- { 0, 64*9+1+TOPSPACE+18, 24}, /* LEGAL */
- { 64*4,64*9+1+TOPSPACE+18, 24}, /* CAPTURE */
- { 0, 64*9+1+TOPSPACE+18*2, 24}, /* TOMOVE */
- { 64*4,64*9+1+TOPSPACE+18*2, 24}, /* PAWNTRIES */
- };
-
- message(line, where)
- char *line;
- {
- char blank[80];
-
- strncpy(blank, line, sizeof blank);
- line = blank + strlen(blank);
- while (line < &blank[sizeof blank])
- *line++ = ' ';
- *--line = '\0';
- strcpy(w[where].buf, blank);
- XText(window, w[where].x, w[where].y, blank, w[where].len,
- font, WhitePixel, BlackPixel);
- }
-
- mclear(where)
- {
- char blank[80];
- char *cp = blank;
-
- while (cp < &blank[sizeof blank])
- *cp++ = ' ';
- *--cp = '\0';
- strcpy(w[where].buf, blank);
- XText(window, w[where].x, w[where].y, blank, w[where].len,
- font, WhitePixel, BlackPixel);
- }
-
- /* which is 0 for all, 1 for stuff on top, and 2 for messages on bottom */
- redraw_message(which)
- {
- register struct w *m;
-
- if (which)
- switch (which) {
- case 1:
- m = w;
- XText(window, m->x, m->y, m->buf, m->len,
- font, WhitePixel, BlackPixel);
- return;
- case 2:
- for (m = &w[1]; m < &w[sizeof w / sizeof (struct w)]; m++)
- XText(window, m->x, m->y, m->buf, m->len,
- font, WhitePixel, BlackPixel);
- return;
- }
- for (m = w; m < &w[sizeof w / sizeof (struct w)]; m++) {
- XText(window, m->x, m->y, m->buf, m->len,
- font, WhitePixel, BlackPixel);
- }
- }
-
- static char *nextchar;
- #define start_char (&w[MESSAGE].buf[9])
- #define end_char (&w[MESSAGE].buf[sizeof (w[MESSAGE].buf) - 1])
-
- start_note()
- {
- message("Message:", MESSAGE);
- nextchar = start_char;
- }
-
- do_note(s, n)
- char *s;
- {
- char c;
-
- while (n-- > 0) {
- switch(*s) {
- case '\b':
- case '\0177': /* DELETE */
- if (nextchar > start_char) {
- nextchar--;
- put_char(' ');
- }
- break;
-
- case '\027': /* Control-W */
- c = *nextchar;
- while (nextchar > start_char && c == ' ') {
- c = *nextchar--;
- put_char(' ');
- }
- while (nextchar > start_char && c != ' ') {
- c = *nextchar--;
- put_char(' ');
- }
- break;
-
- case '\030': /* control-X */
- case '\025': /* control-U */
- while (nextchar > start_char) {
- nextchar--;
- put_char(' ');
- }
- break;
-
- case '\n':
- case '\r':
- *nextchar = '\0';
- fprintf(out, "say %s\r\n", start_char);
- return TRUE;
-
- case '\t': /* Tab */
- *s = ' ';
- /* FALLTHROUGH */
- default:
- if (*s < ' ')
- continue;
- if (nextchar >= end_char)
- continue;
- put_char(*s);
- *nextchar++ = *s;
- break;
-
- }
- s++;
- }
- return FALSE;
- }
-
- put_char(c)
- char c;
- {
- register struct w *m = &w[MESSAGE];
- int x;
-
- *nextchar = '\0';
- x = XStringWidth(m->buf, &info, 0, 0);
- XText(window, m->x+x, m->y, &c, 1, font, WhitePixel, BlackPixel);
- }
-
- refresh()
- {
- XFlush();
- }
-